package com.hucsmn.strstats;

import java.util.*;
import java.util.regex.*;

/**
 * 作业题三：
 * 准备一个 HashMap 集合，统计字符串"123,456,789,123,456"中每个数字字符串出现的次数并打印出来。
 * 如：
 * 123 出现了 2 次
 * 456 出现了 2 次
 * 789 出现了 1 次
 */
public class StringStats {
    public static void main(String[] args) {
        System.out.println("\"123,456,789,123,456\" 的统计结果：");
        System.out.println(Stats.count("123,456,789,123,456"));

        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.print("待统计字符串：");
            String text = sc.nextLine().trim();
            System.out.println("其中：");
            Stats stats = Stats.count(text);
            System.out.println(stats);
        }
    }

    /**
     * 数字字符串统计数据类。
     */
    public static class Stats {
        private static final Pattern REGEX_NUMBER = Pattern.compile("[0-9]+");

        private final HashMap<String, Integer> frequency;

        private Stats(HashMap<String, Integer> frequency) {
            if (frequency == null) {
                throw new IllegalArgumentException();
            }
            this.frequency = frequency;
        }

        /**
         * 统计给定字符串中数字字符串出现的次数。
         *
         * @param text 含有数字字符串的字符串。
         * @return 数字字符串统计数据。
         */
        public static Stats count(String text) {
            HashMap<String, Integer> frequency = new HashMap<>();
            Matcher matcher = REGEX_NUMBER.matcher(text);
            while (matcher.find()) {
                String num = matcher.group();
                Integer f;
                if ((f = frequency.get(num)) != null) {
                    frequency.put(num, f + 1);
                } else {
                    frequency.put(num, 1);
                }
            }
            return new Stats(frequency);
        }

        @Override
        public String toString() {
            final StringBuilder builder = new StringBuilder();
            final String newline = System.lineSeparator();
            for (Map.Entry<String, Integer> entry : frequency.entrySet()) {
                builder
                        .append(entry.getKey())
                        .append(" 出现了 ")
                        .append(entry.getValue())
                        .append(" 次")
                        .append(newline);
            }
            return builder.toString();
        }
    }
}
